/********************************************
 * 功能说明: 
 * 模块名称: 
 * 系统名称: 
 * 软件版权: 
 * 系统版本: 1.0.0
 * 开发人员: zhangfb
 * 开发时间: 2019/3/30 14:57
 * 审核人员: 
 * 相关文档: 
 * 修改记录: 修改日期 修改人员 修改说明
 *********************************************/
package com.hyacinth.schedule.utils;

import com.hyacinth.constant.Constants;
import com.hyacinth.schedule.task.ITask;
import com.hyacinth.schedule.exception.JobException;
import com.hyacinth.utils.ClassUtils;
import com.hyacinth.utils.CollectionUtils;
import com.hyacinth.utils.StringUtils;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 * @author zhangfb
 * @version 1.0.0.1
 * @since JDK 1.8
 */
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class TaskUtils {

    /** 任务列表 **/
    private static Map<String, ITask> taskList;

    /**
     * 获取任务列表
     * @return 任务列表
     */
    public static Map<String, ITask> getTaskList() throws Exception {
        if (taskList == null) {
            Set<Class<?>> clsList = ClassUtils.getAllClasses(Constants.ROOT_PACKAGE_NAME);
            if (clsList == null || clsList.isEmpty()) {
                return taskList;
            }
            taskList = new HashMap<>(32);
            for (Class<?> cls : clsList) {
                if (CollectionUtils.isEmpty(cls.getInterfaces())){
                    continue;
                }
                if (!CollectionUtils.contains(cls.getInterfaces(), ITask.class)){
                    continue;
                }
                taskList.put(StringUtils.uncapitalize(cls.getSimpleName()), (ITask) cls.newInstance());
            }
        }
        return taskList;
    }

    /**
     * 获取任务实例
     * @param taskName 任务名称
     * @return 任务实例
     */
    public static ITask getTask(String taskName) throws Exception {
        Map<String, ITask> taskList = getTaskList();
        if (CollectionUtils.isEmpty(taskList)) {
            return null;
        }
        return taskList.get(taskName);
    }

    /**
     * 执行任务
     * @param taskName 任务名称
     * @param params 参数
     */
    public static void executeTask(String taskName, String params) throws Exception {
        ITask task = getTask(taskName);
        if (task == null) {
            throw new JobException("获取任务实例失败，taskName="+taskName);
        }
        // 执行任务run方法
        task.run(params);
    }

    public static void main(String[] args) throws Exception {
        Map<String, ITask> taskList = getTaskList();
        for (Map.Entry<String, ITask> map : taskList.entrySet()) {
            ITask task = map.getValue();
            task.run(map.getKey());
        }
    }
}
